package com.tedu.api.io;

import org.junit.Test;
import org.junit.experimental.theories.suppliers.TestedOn;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;

/**
 * IO：传输数据 C/S 聊天室Version
 * API上部分：字符串，包装类，日期类，集合
 * ----------电脑三大件：CPU 硬盘 内存
 * API上部分：IO流  ---硬盘---文件数据传输
 *
 * 包位置：java.io
 * File文件，文件夹类
 * 作用：用于表示操作系统中系统的一个文件或者目录
 * 创建file对象--->有参构造器---> "路径+文件/文件夹全称"
 *
 * File类方法使用：
 * 1.查看该文件或者"文件夹:目录”的属性信息（名字，大小，是否存在）
 * 2.操作文件或者“文件夹:目录”（创建，删除）
 * 3.访问一个“文件夹：目录”的子项
 */
public class FileAPI {
    @Test
    public void testFile(){
        //创建文件----手动--demo.txt  char r='\\'
        /*File file=new File("C:\\Users\\hp\\IdeaProjects\\javaapi\\API\\" +
                "src\\main\\java\\com\\ted\\api\\io\\demo.txt");*/

        //相对路径---当前API下创建文件！ 项目：Maven结构 main编写代码
        //FileAPI.java 相对于 API 项目下-->从src开始
        //操作系统：路径 \ 代表路径  文件上传至服务器
        //             / 代表路径  文件下载到本地
        //java任何平台【操作系统】运行   统一路径属性
        //File.separator 静态属性：任何操作系统下转换成正确的路径表示方式
        File file=new File("src"+File.separator+"main"+
                ""+File.separator+"java"+
                ""+File.separator+"com" +
                ""+File.separator+"ted"+
                ""+File.separator+"api"+
                ""+File.separator+"io"+File.separator+"demo.txt");
        //判断文件是否存在的方法
        boolean b=file.exists();
        System.out.println("判断文件是否存在："+b);
    }
    /**
     * 查看文件或者文件属性信息
     * getName()  返回值;String
     * 作用：获取文件的名字【注意：不看路径是否对错】
     * length()   返回值：long
     * 作用：返回当前文件的大小【字节量】
     * exists()   返回值：boolean
     * 作用：判断文件是否存在
     */
    @Test
    public void testFileGL() throws IOException {
        //创建文件类--路径：Maven项目--相对路径
        //相对路径：./   当前API项目下
        File file=new File("."+File.separator+"demo.txt");
        //打印file的路径
        System.out.println("打印file的路径:"+file.getCanonicalPath());
        //文件是否存在
        System.out.println("路径文件是否存在："+file.exists());
        //获取文件/文件夹名字
        String name=file.getName();
        System.out.println("文件/文件夹名字:"+name);
        //获取文件的“大小；字节量”
        long len=file.length();
        System.out.println("获取文件的“大小；字节量:"+len);
    }
    /**
     * 使用代码完成文件或者目录自动创建
     * createNewFile()
     * 作用：创建一个新文件
     * 需求：使用代码完成API项目文件夹下 自动创建 test.txt 文件
     */
    @Test
    public void testCreate() throws IOException {
        //创建文件夹类：路径+全称 ./test.txt
        File file=new File("."+
                ""+File.separator+"test.txt");
        //判断---如果文件不存在---创建
        //       如果文件存在---不创建
        if(!file.exists()){
            System.out.println("文件不存在~~");
            file.createNewFile();
            System.out.println("文件已经创建~~");
        }else{
            System.out.println("文件存在，别创建了~");
        }
    }

    /**
     * delete()
     * 作用：删除文件或文件夹
     * 需求:将API项目下的 text.txt  删除
     */
    @Test
    public void testDelete(){
        //创建File类  路径：./test.txt  ./不写代表 当前API项目
        File file=new File("test.txt");
        //判断 如果文件 存在-->删除
        //            不存在-->删除
        if(file.exists()){
            System.out.println("文件存在");
            file.delete();
            System.out.println("文件删除了~~");
        }else{
            System.out.println("文件已经删除了~~");
        }
    }

    /**
     * mkdir()
     * 作用：创建一个文件夹
     * 需求：在API  项目下 创建一个文件夹 demo
     *
     * 多层文件夹：demo/abc/bcd
     * mkdirs()
     * 作用：创建多层文件夹
     */
    @Test
    public void testMkdir(){
        //创建File文件/文件夹---->创建demo文件夹/abc/bcd
        File file=new File("demo" +
                ""+File.separator+"abc" +
                ""+File.separator+"bcd");
        //判断 如果文件不存在-->创建文件夹
        //            存在-->不创建
        if(!file.exists()){
            System.out.println("文件夹不存在~");
            file.mkdirs();
            System.out.println("创建文件夹~~");
        }else{
            System.out.println("别创建了~");
        }
    }

    /**
     * 作业1：删除多层文件夹 demo/abc/bcd  [不能使用递归]
     * 提示：构造器 new File(File parent,"子路径")
     *       不需要exists判断
     *思路：找到每一级路径【bcd删除完毕---abc删除完毕-demo】
     */
    @Test
    public void testHomeWork1(){
        //1.创建多层文件夹 demo/abc/bcd
        File parent=new File("demo");

        //构造器使用(父级路径，子级路径)：父级路径/子级路径
        File child1=new File(parent,"abc");
        File child2=new File(child1,"bcd");
        child1.delete();
        child2.delete();
        parent.delete();
        //作业2：提示--创建FileFilter接口--匿名内部类
       /* FileFilter ff=new FileFilter() {
            public boolean accept(File pathname) {
                return false;
            }
        };*/
        parent.listFiles(new FileFilter() {
            public boolean accept(File pathname) {
                return false;
            }
        });
    }

    /**
     * 访问文件夹-->所有子项【文件夹和文件】
     * listFiles()     返回值：File[]   文件数组
     * 作用:获取文件夹的所有子项【包含文件夹和文件】
     * isFile()   返回值：boolean
     * 作用：判断是否为文件，是文件夹true，反之
     * isDirectory  返回值：boolean
     * 作用：判断是否为文件夹，是文件夹true，反之
     * 需求：获取API项目下 所有的文件夹文字
     */
    @Test
    public void test() throws IOException {
       //获取API项目
       File file=new File("."+File.separator);
       // System.out.println(file.getCanonicalFile());
        //过滤：3个文件还有4个文件夹，过滤是文件夹
        if(file.isDirectory()){ //过滤没有效果---
            //获取到所有的文件夹
            File[] dir=file.listFiles();
            //遍历所有的文件夹名字
            for(int i=0;i<dir.length;i++){ //i  拿到所有的下标
                //打印文件夹名字
                System.out.println(dir[i].getName());
            }
        }
    }

}

